
package br.uefs.ecomp.redeneural.model;

import br.uefs.ecomp.redeneural.model.io.VetorEntrada;
import java.util.ArrayList;

/**
 *
 * @author Beto
 */
public class Treino {

    public static Rede treinar(Rede rede, ArrayList<VetorEntrada> vetorEntradas, double taxaAprendizagem, double erroLimite) {
        double erroAnterior = Double.MAX_VALUE;
        double erroAtual    = 1;
        double saida[];
        double EQ, EQM;
        int epoca = 0;

        while(erroAtual > erroLimite) {
            epoca++;
            //erroAnterior = erroAtual;
            EQ = 0; EQM = 0;

            System.out.println("Epoca: " + epoca);

            for (int i = 0; i < vetorEntradas.size(); i++) {
                saida = Algoritmos.forward(rede, vetorEntradas.get(i));

                double aux = Math.pow(vetorEntradas.get(i).getSaidaDesejada() - saida[0], 2);
                EQ += (0.5 * aux);

                //System.out.println("Epoca: " + epoca + " | " + "Saida: " + saida[0] + " | " + "Desejado: " + vetorEntradas.get(i).getSaidaDesejada());

                rede = Algoritmos.backward(rede, vetorEntradas.get(i).getSaidaDesejada(), taxaAprendizagem);
            }

            EQM = EQ / vetorEntradas.size();
            erroAtual = EQM;

            System.out.println(EQM);
        }

        return rede;
    }
    
}
